package com.qilu.careprogram.service;

import com.qilu.careprogram.pojo.dto.NurseInfoDTO;
import com.qilu.careprogram.pojo.dto.ProstateSurgeryInfoDTO;
import com.qilu.careprogram.pojo.entity.PatientInfo;
import com.qilu.careprogram.pojo.dto.AddDrugDTO;
import com.qilu.careprogram.pojo.dto.*;
import com.qilu.careprogram.pojo.entity.Carousel;
import com.qilu.careprogram.pojo.entity.HotArticle;
import com.qilu.careprogram.pojo.dto.UpdateDrugDTO;
import com.qilu.careprogram.pojo.entity.Drug;
import com.qilu.careprogram.pojo.vo.*;
import com.qilu.careprogram.pojo.dto.PatientLoginDTO;
import com.qilu.careprogram.model.Result;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface PatientService {

    /**
     * 获取用户收藏的文章ID列表
     */
    List<Long> getUserLikeHotArticlesId(String hospitalNumber);

    /**
     * 取消收藏文章
     */
    void deleteLike(String hospitalNumber, Long hotArticleId);

    /**
     * 收藏文章
     */
    void addLike(String hospitalNumber, Long hotArticleId);

    /**
     * 获取用户收藏的文章详情列表
     */
    List<HotArticle> getUserLike(String hospitalNumber);

    /**
     * 获取所有轮播图
     */
    List<Carousel> getAllCarousel();

    /**
     * 获取所有热门文章
     */
    List<HotArticle> getAllHotArticles();

    /**
     * 添加轮播图
     */
    void addCarousel(AddCarouselDTO addCarouselDTO);

    /**
     * 添加热门文章
     */
    void addHotArticle(AddHotArticleDTO addHotArticleDTO);

    /**
     * 修改轮播图启用状态
     */
    void changeCarouselIsused(ChangeCarouselIsusedDTO dto);

    /**
     * 修改热门文章启用状态
     */
    void changeHotArticleIsused(ChangeHotArticleIsusedDTO dto);

    /**
     * 修改轮播图信息
     */
    void updateCarousel(UpdateCarouselDTO dto);

    /**
     * 修改热门文章信息
     */
    void updateHotArticle(UpdateHotArticleDTO dto);

    /**
     * 查询所有药品信息
     * @return 药品列表
     */
    List<Drug> getAllDrug();

    /**
     * 修改药品启用状态
     * @param id 药品ID
     * @param isused 新状态
     * @return 是否成功
     */
    boolean changeDrugUse(Long id, String isused);

    /**
     * 添加药品
     * @param addDrugDTO 药品信息
     * @return 是否成功
     */
    boolean addDrug(AddDrugDTO addDrugDTO);

    /**
     * 修改药品信息
     * @param updateDrugDTO 药品信息（含ID）
     * @return 是否成功
     */
    boolean changeDrug(UpdateDrugDTO updateDrugDTO);

    /**
     * 查询复查信息
     * @param hospitalNumber 住院号
     * @param reviewItem 复查项目
     * @param startTime 预约开始时间
     * @param endTime 预约结束时间
     * @return 复查信息列表
     */
    List<ReviewInfoVO> getReviewInfo(String hospitalNumber, String reviewItem, String startTime, String endTime) throws Exception;

    /**
     * 发送短信验证码
     * @param phoneNumber 患者电话号码
     */
    Result<String> sendVerificationCode(String phoneNumber);
    /**
     * 重置密码
     * @param patientLoginDTO 重置内容
     */
    Result<String> resetKey(PatientLoginDTO patientLoginDTO);
    /**
     * 确认信息填报
     * @param hospitalNumber 住院号
     */
    Result<String> checkInfoWrite(String hospitalNumber);
    /**
     * 新增填报信息
     * @param nurseInfoDTO
     */
    void insertNurseInfo(NurseInfoDTO nurseInfoDTO) throws Exception;

    PatientInfoVO getPatientInfoByHospitalNumber(String hospitalNumber);

    /**
     * 根据条件查询患者信息
     * @param gender 性别
     * @param startAge 起始年龄
     * @param endAge 结束年龄
     * @param disease 疾病类型
     * @return 查询结果
     */
    List<PatientInfoWithRegisterVO> selectPatientInfo(String gender, int startAge, int endAge, String disease, String isRegister) throws Exception;

    /*
    * 获取当日填报量
    * */
    int getPatientReVisitsCountToday();

    /**
     *
     * 获取所有病人信息和回访记录
     * @throws IOException
     */

    List<PatientInfoReturnVisitListVO> getPatientInfoReturnVisitList();

    /**
     * 根据时间范围获取病人信息和回访记录
     * @param startTime
     * @param endTime
     * @return
     */
    List<PatientInfoReturnVisitListVO> getPatientInfoReturnVisitList(Date startTime, Date endTime);

    void deleteReturnVisitList(List<Long> ids);

    void deletePatientInfoProstateCancerList(List<Long> ids);
    /**
     *
     * @param prostateSurgeryInfoDTO
     */
    void insertProstateSurgeryInfo(ProstateSurgeryInfoDTO prostateSurgeryInfoDTO);

    List<PatientInfoProstateCancerVO> getPatientInfoProstateCancerList();

    List<PatientInfoProstateCancerVO> getPatientInfoProstateCancerList(Date startTime, Date endTime);

    /**
     * 管理住院号
     * @param hospitalNumber 住院号
     * @param authority 科室
     * @return 操作结果
     */
    void addPatient(String hospitalNumber, String authority, String idCard, String limRevisitTime) throws Exception;

    void deletePatient(String hospitalNumber) throws Exception;

    /**
     * 患者注册方法
     * @param patientLoginDTO 包含住院号、用户名和密码的 DTO
     * @return 注册结果
     */
    Result<String> register(PatientLoginDTO patientLoginDTO) throws Exception;

    /**
     * 患者登录方法
     * @param patientLoginDTO 包含用户名和密码的 DTO
     * @return 登录结果，成功则返回 token与患者住院号
     */
    Result<Map<String, Object>> login(PatientLoginDTO patientLoginDTO) throws Exception;

    Result<Map<String,Object>> changePatientInfo(PatientInfo patientInfo);

    Result<List<ReturnVisitVO>> getReturnVisitList(String hospitalNumber, String gender, String idCard, String startTime, String endTime);

    Result<List<ProstateCancerVO>> getProstateCancerVOS(String hospitalNumber, String gender, String idCard, String startTime, String endTime);

    Result<List<CycleRemindVO>> getCycleRemindInfo(String authority, String hospitalNumber, String idCard, String cycleInterval, String limitInterval, String ifBeyondInterval);

    Result changePatientInterval(String hospitalNumber, String newInterval);
}
